/*
 * @Author: he4966
 */
//! se版本
#include <lvgl.h>     //! 含arduino  main.h 硬件管脚  tft配置
#include <TFT_eSPI.h> //! squerline ui的外面再套一层,主要是为了设置group
#include "ui.h"
#include "vars.h"
#include <string.h>

#include <WiFi.h>
#include <HTTPClient.h>
// #include "lvgl/src/lv_misc/lv_color.h"
// #include <ArduinoJson.h> // 需要安装 ArduinoJson 库

#include "time.h"
#include "ip.h"

// 替换为你的 WiFi 网络名称和密码
const char *ssid = "xiaohe";
const char *password = "23456789";





int32_t time_stamp;

extern "C" int32_t get_var_time_stamp() {
    return time_stamp;
}

extern "C" void set_var_time_stamp(int32_t value) {
    if(value>1000000)
    time_stamp = value;
}


std::string year_var;

extern "C" const char *get_var_year_var() {
    return year_var.c_str();
}

extern "C" void set_var_year_var(const char *value) {
    year_var = value;
}


//时间文字
std::string time_text;

extern "C" const char *get_var_time_text() {
    return time_text.c_str();
}

extern "C" void set_var_time_text(const char *value) {
    time_text = value;
}

// 定义一个变量来记录上次执行的时间
unsigned long lastUpdateTime = 0;



static const uint16_t screenWidth = 280;

static const uint16_t screenHeight = 240;

static lv_disp_draw_buf_t draw_buf;
static lv_color_t buf[screenWidth * screenHeight / 10];

TFT_eSPI tft = TFT_eSPI(screenWidth, screenHeight); /* TFT instance */
#if LV_USE_LOG != 0
void my_print(const char *buf)
{
    Serial.printf(buf);
    Serial.flush();
}
#endif



void my_disp_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p)
{
    // 计算需要显示的宽度
    uint32_t w = (area->x2 - area->x1 + 1);
    // 计算需要显示的高度
    uint32_t h = (area->y2 - area->y1 + 1);

    // 开始写入数据到TFT屏幕
    tft.startWrite();
    //  设置TFT屏幕的显示区域，未偏移
    // tft.setAddrWindow( area->x1, area->y1, w, h );//未偏移

    // 设置偏移量
    // 设置TFT屏幕的显示区域，向右偏移20个像素
    tft.setAddrWindow(area->x1 + 20, area->y1, w, h); // 向右偏移20个像素
    tft.pushColors((uint16_t *)&color_p->full, w * h, true);
    // 结束写入数据到TFT屏幕
    tft.endWrite();

    // 通知LVGL显示驱动显示已经准备好
    lv_disp_flush_ready(disp_drv);
}

void setup()
{
    Serial.begin(115200); /* prepare for possible serial debug */

    // 初始化LVGL库
    lv_init();

    // 如果启用了LVGL日志功能，则注册自定义打印函数用于调试
#if LV_USE_LOG != 0
    lv_log_register_print_cb(my_print); /* register print function for debugging */
#endif

    // 初始化TFT屏幕
    tft.begin();        /* TFT init */
    tft.setRotation(3); /* Landscape orientation, flipped */
    // 设置屏幕的显示区域，考虑偏移量
    // tft.setAddrWindow(40, 0, screenWidth, screenHeight);

    // 初始化显示缓冲区
    lv_disp_draw_buf_init(&draw_buf, buf, NULL, screenWidth * screenHeight / 10);

    /*Initialize the display*/
    static lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    // 设置显示驱动的水平分辨率和垂直分辨率
    //  /*Change the following line to your display resolution*/
    disp_drv.hor_res = screenWidth;  // 水平分辨率
    disp_drv.ver_res = screenHeight; // 垂直分辨率

    disp_drv.flush_cb = my_disp_flush;
    disp_drv.draw_buf = &draw_buf;
    lv_disp_drv_register(&disp_drv);

    // 初始化输入设备驱动
    static lv_indev_drv_t indev_drv;
    lv_indev_drv_init(&indev_drv);

    // 初始化用户界面
    ui_init();

    // 打印设置完成的信息
    Serial.println("Setup done222");

    // 连接到 WiFi
    WiFi.begin(ssid, password);
    Serial.println("Connecting to WiFi");

    // 等待WiFi连接成功
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(500);
        Serial.print(".");
    }

    // 打印连接成功的信息和IP地址
    Serial.println("\nConnected to WiFi");
    Serial.print("IP Address: ");
    Serial.println(WiFi.localIP());


      //初始化网络时间戳
    set_var_time_stamp(getTimeStamp());
}



void time_show(){

//  timeClient.update(); // 更新 NTP 时间
//   String timedate = timeClient.getFormattedTime(); // 获取格式化的时间字符串

  // 将时间字符串存储到全局变量中
  // set_var_time_text(timedate.c_str());

  // 打印日期和时间
  // Serial.println("Current time: " + timedate);


  time_t rawTime = get_var_time_stamp();
    struct tm * timeinfo;
  timeinfo = localtime(&rawTime);
   // 手动调整时区为 UTC+8
  timeinfo->tm_hour = (timeinfo->tm_hour + 8) % 24;
  String year_str = String(timeinfo->tm_year + 1900) + "年" + String(timeinfo->tm_mon + 1) + "月" + String(timeinfo->tm_mday)+"日";
  set_var_year_var(year_str.c_str());
  String timedate =   String(timeinfo->tm_hour) + ":" + String(timeinfo->tm_min) + ":" + String(timeinfo->tm_sec);
//   // 打印日期和时间
//   Serial.print("年: ");
//   Serial.print(timeinfo->tm_year + 1900); // tm_year是从1900年开始的年份，所以需要加1900
//   Serial.print("-");
//   Serial.print(timeinfo->tm_mon + 1); // tm_mon是从0开始的月份，所以需要加1
//   Serial.print("-");
//   Serial.print(timeinfo->tm_mday);
//   Serial.print(" ");
//   Serial.print(timeinfo->tm_hour);
//   Serial.print(":");
//   Serial.print(timeinfo->tm_min);
//   Serial.print(":");
//   Serial.println(timeinfo->tm_sec);
  set_var_time_text(timedate.c_str());
}

void loop()
{
    lv_timer_handler();

    static uint32_t num = 0;
    num++;
  // Serial.println(num);
  if(num==2000){
    // String myIP = getMyIP();
    set_var_time_stamp(getTimeStamp());

    // Serial.println("My IP address is: " + myIP);
    // String timedate = getTime();
    
 
    // Serial.println("Time " + timedate);
    // set_var_time_stamp_str(timedate.c_str());
    num=0;

  }

     // 每1000ms执行一次
  unsigned long currentTime = millis();
  if (currentTime - lastUpdateTime >= 1000) {
      Serial.println("millis: " + String(currentTime));
      set_var_time_stamp(get_var_time_stamp() + 1);
      time_show();
      lastUpdateTime = currentTime; // 更新上次执行的时间
  }

    // if(num ==3000 ){
    //     loadScreen(SCREEN_ID_P2);
    // }

    // if(num == 4000 ){
    //     loadScreen(SCREEN_ID_MAIN);
       
    //     num = 0;
    // }
    ui_tick();
    delay(1);
}
